function  FigOut = MmapShowDEM(varargin)
%% DEM画图显示
% 高程显示
% Date: 14-Jun-2022
% Author: Xiaoyeyimier
% Email: xiaoyeyimier@163.com
% Wechat: xiaoyeyimier
%========================================================================%
% 参数检查
if nargin<3
    error('The input to the function requires a minimum of three arguments!');
else
    % --读取纬度
    % 纬度可以使用name-value 参数对,也可以使用默认参数第一个
    if any(strcmpi(varargin,'Lat')) % 参数对搜索
        tempIdx = find(strcmpi(varargin,'Lat'))+1; % 名称-参数对中参数的索引
        if tempIdx>nargin% 参数对不匹配报错
            error(['MmapShowDEM syntax error :',...
                ' ''Lon'' parameter-value pairs check failed!']);
        elseif ~isnumeric(varargin{tempIdx})% 参数数据类型不匹配
            error('MmapShowDEM syntax error : ''Lat'' must be numeric!');
        elseif length(varargin{tempIdx})<2% 数值量数据个数的检查
            error('MmapShowDEM syntax error : ''Lat'' must be be a vector!');
        else
            Lat = varargin{tempIdx};
        end
    else% 不使用参数对输入纬度，直接使用第一个输入参数
        if ~isnumeric(varargin{1})% 第一输入参数数据类型不匹配
            error('MmapShowDEM syntax error : ''Lat'' must be numeric!');
        elseif length(varargin{1})<2 % 数据类型不匹配
            error('MmapShowDEM syntax error : ''Lat'' must be be a vector!');
        else % 检查通过，赋值
            Lat = varargin{1};
        end
    end
    % --读取经度
    % 经度可以使用name-value 参数对,也可以使用默认参数第二个
    if any(strcmpi(varargin,'Lon')) % 参数对搜索
        tempIdx = find(strcmpi(varargin,'Lon'))+1; % 名称-参数对中参数的索引
        if tempIdx>nargin % 参数对匹配错误
            error(['MmapShowDEM syntax error :',...
                ' ''Lon'' parameter-value pairs check failed!']);
        elseif ~isnumeric(varargin{tempIdx})% 数据类型不匹配
            error('MmapShowDEM syntax error : ''Lon'' must be numeric!');
        elseif length(varargin{tempIdx})<2 % 数值量数据个数检查
            error('MmapShowDEM syntax error : ''Lon'' must be be a vector!');
        else
            Lon = varargin{tempIdx};
        end
    else% 不使用参数对输入纬度，直接使用第二个输入参数
        if ~isnumeric(varargin{2})% 数据类型不匹配
            error('MmapShowDEM syntax error : ''Lat'' must be numeric!');
        elseif length(varargin{2})<2% 数值量数据个数检查
            error('MmapShowDEM syntax error : ''Lat'' must be be a vector!');
        else% 检查通过，赋值
            Lon = varargin{2};
        end
    end
    % --读取高程
    % 经度可以使用name-value 参数对,也可以使用默认参数第三个
    if any(strcmpi(varargin,'Alt')) % 参数对搜索
        tempIdx = find(strcmpi(varargin,'Alt'))+1; % 名称-参数对中参数的索引
        if tempIdx>nargin % 参数对匹配错误
            error(['MmapShowDEM syntax error :',...
                ' ''Alt'' parameter-value pairs check failed!']);
        elseif ~isnumeric(varargin{tempIdx})% 数据类型不匹配
            error('MmapShowDEM syntax error : ''Alt'' must be numeric!');
        elseif size(varargin{tempIdx})<2 % 数值量数据个数检查
            error('MmapShowDEM syntax error : ''Alt'' must be be a vector!');
        else
            Alt = varargin{tempIdx};
        end
    else% 不使用参数对输入纬度，直接使用第三个输入参数
        if ~isnumeric(varargin{3})% 数据类型不匹配
            error('MmapShowDEM syntax error : ''Lat'' must be numeric!');
        elseif length(varargin{3})<2% 数值量数据个数检查
            error('MmapShowDEM syntax error : ''Lat'' must be be a vector!');
        else% 检查通过，赋值
            Alt = varargin{3};
        end
    end
    if ~isvector(Alt)% methodflag==0的矩形读取模式
        [altSizeX,altSizeY] = size(Alt);
        lenLon = length(Lon);
        lenLat = length(Lat);
        if ~isequal([lenLat,lenLon],[altSizeX,altSizeY])&&...
                ~isequal([lenLon,lenLat],[altSizeX,altSizeY])
            error(['MmapShowDEM input data error : The input longitude, latitude and',...
                ' elevation data does not match each other!'])
        end
        showflag=1;
    else
        lenalt = length(Alt);
        lenLon = length(Lon);
        lenLat = length(Lat);
        if ~isequal(lenalt,lenLon,lenLat)% methodflag==1的两点连线读取模式
            error(['MmapShowDEM input data error : The input longitude, latitude and',...
                ' elevation data does not match each other!'])
        end
        showflag=0;
    end
end
% 画在新图上
FigOut = figure('color','w');
if showflag
    % 常数
    WATERLINE = 5;   % 水线通常在2左右
    LANDCOLOR = 1024; % 地面颜色个数
    DEEPESTC = -6; % 最深的颜色对应的高度
    HIGHESTC = 3000; % 最浅的颜色对应的高度
    % 确定边界
    clat = [min(Lat) max(Lat)];                 % 纬度边界
    clon = [min(Lon) max(Lon)];                 % 经度边界
    Mele = max(HIGHESTC,max(max(Alt)));         % 最高高程,取地图最高位置或者HIGHESTC预设值中较大的
    m_proj('equidistant','lon',clon,'lat',clat);% 确定投影
    % 阴影与浮雕 (右侧图)
    % subplot(1,2,2);
    caxis([DEEPESTC,Mele]);% 高度彩色边界
    WaterColor = floor((WATERLINE-DEEPESTC)/(Mele-WATERLINE)*LANDCOLOR);% 水下颜色个数
    colormap([m_colmap('blues',WaterColor);m_colmap('gland',LANDCOLOR)]);  % 地图颜色
    m_shadedrelief(Lon,Lat.',Alt); % 画图
    m_grid('box','on','grid','k','fontsize',10);%
    colorbar();
else
    wgs84 = wgs84Ellipsoid;
    PtsLLA = [Lat,Lon,Alt];
    PtsECEF = lla2ecef(PtsLLA,'wgs84');
    deltL = norm(PtsECEF(1,:)-PtsECEF(2,:));
    [Edata,Ndata,Udata] = ecef2enu(PtsECEF(:,1),PtsECEF(:,2),PtsECEF(:,3),...
        PtsLLA(1,1),PtsLLA(1,2),PtsLLA(1,3),wgs84);
    subplot(2,2,1);
    plot(Edata/1e3,Alt);
    title('(a)Elevation data corresponding to east displacement')
    xlabel('East displacement/km');
    ylabel('Elevation data/m');
    subplot(2,2,2);
    plot(Ndata/1e3,Alt);
    title('(b)Elevation data corresponding to north displacement')
    xlabel('North displacement/km');
    ylabel('Elevation data/m');
    subplot(2,2,3);
    plot(deltL*(0:length(Alt)-1)/1e3,Alt);
    title('(c)Elevation data corresponding to displacement')
    xlabel('Displacement/km');
    ylabel('Elevation data/m');
    subplot(2,2,4);
    plot3(Edata/1e3,Ndata/1e3,Udata);
    title('(d)3D curve')
    xlabel('East displacement/km');
    ylabel('North displacement/km');
    zlabel('Elevation data/m')
    view([45,45]);
end
end